package metodos;

import datos.Datos;
import java.util.ArrayList;


public class OneRule extends Metodo {

    ArrayList<TablaOneRule> tablas;
    Datos datos;

    public OneRule(Datos datos) {
        tablas = new ArrayList<TablaOneRule>();
        this.datos = datos;
    }

    /**
     * Función que se encarga de hacer los calculos correspondientes para sacar
     * las reglas.
     *
     * @param lista recibe un ArrayList de ArrayList<String> con todos los
     * registros de la base de datos.
     * @param indiceClase es el indice de la columna a la que se le calculará
     * las reglas.
     */
    @Override
    public void Calcular() {
        ArrayList<ArrayList<String>> lista = datos.getLista();
        if (lista.size() > 0) {
            //Aqui se sacan los valores
            ArrayList<String> valores = lista.get(0);
            int indice = 0;
            for (int j = 0; j < valores.size(); j++) {
                //Si el indice actal es el de la clase no se calcula una tabla de atributo.
                if (j == getIndiceTitulo(datos.getTitulos(), datos.getNombreClase())) {
                    continue;
                }

                TablaOneRule nuevaTabla = new TablaOneRule();
                nuevaTabla.setLista(lista);
                nuevaTabla.setNombre(datos.getTitulos()[j]);
                nuevaTabla.setNombreSalida(datos.getNombreClase());
                tablas.add(nuevaTabla);
                tablas.get(indice++).Determinar(j, getIndiceTitulo(datos.getTitulos(), datos.getNombreClase()));
            }

        }
    }

    private int getIndiceTitulo(String[] titulos, String nombre) {
        for (int i = 0; i < titulos.length; i++) {
            if (titulos[i].equals(nombre)) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public String LeerReglas() {
        //Aca se sacan las reglas
        float mayor = 0;
        //Aqui se busca la tabla de atributos que tenga el mayor porcentaje de veracidad.
        TablaOneRule tablaRegla = null;
        for (int i = 0; i < tablas.size(); i++) {
            float aux = tablas.get(i).getPorcenjateVeracidad();
            if (aux > mayor) {
                mayor = aux;
                tablaRegla = tablas.get(i);
            }
        }
        return tablaRegla.LeerRegla();
    }

    @Override
    public String LeerReglasProlog() {


        //Aca se sacan las reglas
        float mayor = 0;
        //Aqui se busca la tabla de atributos que tenga el mayor porcentaje de veracidad.
        TablaOneRule tablaRegla = null;
        for (int i = 0; i < tablas.size(); i++) {
            float aux = tablas.get(i).getPorcenjateVeracidad();
            if (aux > mayor) {
                mayor = aux;
                tablaRegla = tablas.get(i);
            }
        }
        tablaRegla.setPosiblesValores(datos.getPosiblesValores());
        tablaRegla.setTitulos(datos.getTitulos());
        return tablaRegla.LeerReglaProlog();

    }
    
    public Datos getDatos() {
        return datos;
    }

   
    
}
